﻿//// ===============================================================================
//// XCI.NET 西安交通信息WinForm开发框架 2018 版权所有
//// ===============================================================================
//using System;
//using System.Collections;
//using System.Collections.Generic;
//using System.ComponentModel;
//using System.Data;
//using System.Drawing;
//using System.IO;
//using System.Linq;
//using System.Text;
//using System.Windows.Forms;
//using DevExpress.Data;
//using DevExpress.Data.Helpers;
//using DevExpress.Utils;
//using DevExpress.Utils.Serializing;
//using DevExpress.XtraBars;
//using DevExpress.XtraEditors;
//using DevExpress.XtraGrid;
//using DevExpress.XtraGrid.Columns;
//using DevExpress.XtraGrid.Views.Grid;
//using DevExpress.XtraGrid.Views.Grid.ViewInfo;
//using XCI.Core;
//using XCI.Extensions;
//using XCI.Helper;
//using XCI.Windows.Plugin.GridSetting;

//namespace XCI.Windows.Controls
//{
//    [System.ComponentModel.DesignerCategory("Code")]
//    [ToolboxItem(true)]
//    public class GridViewEx : GridView
//    {
//        public const string GridViewTypeName = "GridViewEx";
//        private string _id = StringHelper.Guid();
//        private PageParam _pageParam = new PageParam();
//        private readonly Dictionary<string, PrimaryKeyValue> changedDatas = new Dictionary<string, PrimaryKeyValue>();
//        private bool allowLoadSetting = true;
//        private readonly GridOptionsCustom optionsCustom;
//        private PopupMenu popupMenuControl;
//        //private string currentSortName;
//        //private string currentSortDir;

//        /// <summary>
//        /// 视图Id
//        /// </summary>
//        [Browsable(false)]
//        public string Id
//        {
//            get { return _id; }
//            set { _id = value; }
//        }

//        /// <summary>
//        /// 当前焦点是否是第一行
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool IsFirstFocus
//        {
//            get { return HasData && IsFirstRow; }
//        }

//        /// <summary>
//        /// 当前焦点是否是最后一行
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool IsLastFocus
//        {
//            get { return HasData && IsLastRow; }
//        }

//        /// <summary>
//        /// 当前是否选中多条
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool HasMultiSelect
//        {
//            get { return GetSelectedRows().Length > 1; }
//        }

//        /// <summary>
//        /// 是否包含数据
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool HasData
//        {
//            get { return DataRowCount > 0; }
//        }

//        /// <summary>
//        /// 是否单选数据
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool HasSingleSelected
//        {
//            get
//            {
//                if (OptionsSelection.MultiSelect)
//                {
//                    return GetSelectedRows().Length == 1;
//                }
//                return FocusedRowHandle > -1;
//            }
//        }

//        /// <summary>
//        /// 是否选中数据(单选或者多选)
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool HasSelected
//        {
//            get
//            {
//                if (OptionsSelection.MultiSelect)
//                {
//                    return GetSelectedRows().Length > 0;
//                }
//                return FocusedRowHandle > -1;
//            }
//        }
//        /// <summary>
//        /// 是否勾选数据(只针对多选)
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool HasMultiChecked
//        {
//            get
//            {
//                if (OptionsSelection.MultiSelect)
//                {
//                    return GetSelectedRows().Length > 0;
//                }
//                return false;
//            }
//        }
//        /// <summary>
//        /// 是否有数据被修改
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool HasDataChanged
//        {
//            get { return changedDatas.Count > 0; }
//        }

//        /// <summary>
//        /// 是否允许加载表格配置
//        /// </summary>
//        [Browsable(true)]
//        [Category("XCI")]
//        [Description("是否允许加载表格配置")]
//        [DefaultValue(true)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
//        public bool AllowLoadSetting
//        {
//            get { return allowLoadSetting; }
//            set { allowLoadSetting = value; }
//        }

//        /// <summary>
//        /// 是否已加载表格配置
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool IsLoadedSetting { get; private set; }

//        /// <summary>
//        /// 是否已自动生成列
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public bool IsAutoGeneratedColumn { get; private set; }

//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public GridControlEx GridControlEx
//        {
//            get { return GridControl as GridControlEx; }
//            set { GridControl = value; }
//        }

//        /// <summary>
//        /// 当前分页参数
//        /// </summary>
//        [Browsable(false)]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        public PageParam PageParam
//        {
//            get
//            {
//                _pageParam.Clear();
//                if (PagerControl!=null)
//                {
//                    _pageParam.PageIndex = PagerControl.PageIndex;
//                    _pageParam.PageSize = PagerControl.PageSize;
//                }
//                if (SortInfo.Count > 0)
//                {
//                    var sortInfo = SortInfo[0];
//                    _pageParam.SortName = StringHelper.HumpToLine(sortInfo.Column.FieldName);
//                    _pageParam.SortDir = sortInfo.SortDir == ColumnSortOrder.Ascending ? "asc" : "desc";
//                }
//                return _pageParam;
//            }
//        }

//        /// <summary>
//        /// 右键菜单控件
//        /// </summary>
//        [Browsable(true)]
//        [Category("XCI")]
//        [Description("右键菜单控件")]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
//        public PopupMenu PopupMenuControl
//        {
//            get
//            {
//                if (DesignMode) return null;
//                if (popupMenuControl != null) return popupMenuControl;
//                var menuManager = this.GridControl.MenuManager;
//                if (menuManager != null)
//                {
//                    popupMenuControl = new PopupMenu();
//                    popupMenuControl.Manager = (BarManager)menuManager;
//                }
//                return popupMenuControl;
//            }
//            set { popupMenuControl = value; }
//        }

//        /// <summary>
//        /// 分页控件
//        /// </summary>
//        [Browsable(true)]
//        [Category("XCI")]
//        [Description("分页控件")]
//        public GridPager PagerControl
//        {
//            get;set;
//        }

//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
//        [XtraSerializableProperty(XtraSerializationVisibility.Hidden)]
//        [Browsable(false)]
//        public new string FindFilterText
//        {
//            get { return base.FindFilterText; }
//            set { base.FindFilterText = value; }
//        }

//        [DXCategory("Options")]
//        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
//        [Description("自定义选项")]//[DisplayName("自定义选项")]
//        [XtraSerializableProperty(XtraSerializationVisibility.Content)]
//        public GridOptionsCustom OptionsCustom
//        {
//            get { return this.optionsCustom; }
//        }

//        /// <summary>
//        /// 修改数据事件
//        /// </summary>
//        public event EventHandler<EventArgs> ModifyData;

//        protected void OnModifyData(EventArgs e)
//        {
//            if (ModifyData != null)
//            {
//                ModifyData(this, e);
//            }
//        }

//        ///// <summary>
//        ///// 选中行改变事件
//        ///// </summary>
//        //public event EventHandler<EventArgs> SelectedIndexChanged;

//        ///// <summary>
//        ///// 选中行改变事件
//        ///// </summary>
//        //protected void OnSelectedIndexChanged()
//        //{
//        //    SelectedIndexChanged?.Invoke(this, EventArgs.Empty);
//        //}

//        public GridViewEx()
//            : this(null)
//        {

//        }

//        public GridViewEx(GridControl grid)
//            : base(grid)
//        {
//            this.optionsCustom = CreateOptionsCustom();
//            this.OptionsView.ShowGroupPanel = false;
//            this.OptionsBehavior.Editable = false;
//            // ReSharper disable once DoNotCallOverridableMethodsInConstructor
//            this.IndicatorWidth = 35;
//            this.OptionsSelection.EnableAppearanceHideSelection = false;
//        }


//        protected override void OnEndInit()
//        {
//            base.OnEndInit();
//            if (DesignMode) return;

//            InitPlugin();
//            InitializePopupMenu();

//            if (OptionsView.ShowIndicator)
//            {
//                this.CustomDrawRowIndicator += View_CustomDrawRowIndicator;
//            }

//            //if (OptionsSelection.MultiSelect)
//            //{
//            //    this.SelectionChanged += (s, e) => OnSelectedIndexChanged();
//            //}
//            //else
//            //{
//            //    this.FocusedRowChanged += (s, e) => OnSelectedIndexChanged();
//            //}

//            if (optionsCustom.AllowRecordModifyData)
//            {
//                this.CellValueChanged += View_CellValueChanged;
//            }

//            if (optionsCustom.AllowShowPopupMenu)
//            {
//                this.MouseUp += View_MouseUp;
//            }
//        }

//        private void View_CustomDrawRowIndicator(object sender, RowIndicatorCustomDrawEventArgs e)
//        {
//            if (e.Info.IsRowIndicator && e.RowHandle >= 0)
//            {
//                e.Info.DisplayText = (e.RowHandle + 1).ToString();
//                e.Info.ImageIndex = -1;
//            }
//        }

//        void View_MouseUp(object sender, MouseEventArgs e)
//        {
//            GridHitInfo hi = CalcHitInfo(e.Location);
//            if (PopupMenuControl != null && e.Button == MouseButtons.Right && (hi.InRow || hi.InRowCell))
//            {
//                PopupMenuControl.ShowPopup(Control.MousePosition);
//            }
//        }


//        //protected override DevExpress.XtraEditors.Filtering.FilterColumnCollection CreateFilterColumnCollection()
//        //{
//        //    return base.CreateFilterColumnCollection();
//        //    //return new ViewFilterColumnCollectionx(this);
//        //}

//        protected GridOptionsCustom CreateOptionsCustom()
//        {
//            return new GridOptionsCustom();
//        }

//        protected override void OnDataSourceChanging()
//        {
//            base.OnDataSourceChanging();
//            if (optionsCustom.AllowAutoGeneratedColumns && !IsLoadedSetting && !IsAutoGeneratedColumn)
//            {
//                AutoGeneratedColumn();
//            }
//        }

//        protected override System.Collections.Generic.List<DevExpress.Data.IDataColumnInfo> GetFindToColumnsCollection()
//        {
//            //return base.GetFindToColumnsCollection();
//            List<IDataColumnInfo> res = new List<IDataColumnInfo>();
//            foreach (GridColumn gridColumn in this.Columns)
//            {
//                if (this.IsAllowFindColumn(gridColumn))
//                    res.Add(this.CreateIDataColumnInfoForFilter(gridColumn));
//            }
//            foreach (GridColumn gridColumn in this.GroupedColumns)
//            {
//                if (!this.ContainsIDataColumnInfoForFilter(res, gridColumn) && this.IsAllowFindColumn(gridColumn))
//                    res.Add(this.CreateIDataColumnInfoForFilter(gridColumn));
//            }
//            return res;
//        }

//        internal bool IsAllowFindColumn(GridColumn col)
//        {
//            if (col == null || string.IsNullOrEmpty(col.FieldName) || col.RealColumnEdit != null && !col.RealColumnEdit.AllowInplaceAutoFilter || !this.CanColumnDoServerAction(col, ColumnServerActionType.Filter))
//                return false;
//            string str = this.OptionsFind.FindFilterColumns;
//            if (!str.Equals("*"))
//                return (";" + str + ";").Contains(";" + col.FieldName + ";");

//            DataColumnInfo columnInfo;
//            if (col.View == null || col.ColumnHandle == -1 || col.ColumnHandle >= col.View.DataController.Columns.Count)
//                columnInfo = null;
//            else
//                columnInfo = DataController.Columns[col.ColumnHandle];

//            return this.DataController.CanFindColumn(columnInfo);
//        }

//        #region DataChanged

//        /// <summary>
//        /// 添加改变的列值
//        /// </summary>
//        /// <param name="item">改变项</param>
//        private void AddDataChanged(PrimaryKeyValue item)
//        {
//            if (string.IsNullOrEmpty(item.Id)) return;
//            PrimaryKeyValue value;
//            var cacheKey = item.Id + item.Key;
//            if (changedDatas.TryGetValue(cacheKey, out value))
//            {
//                value.Value = item.Value;
//            }
//            else
//            {
//                changedDatas.Add(cacheKey, item);
//            }
//        }

//        /// <summary>
//        /// 获取改变的数据
//        /// </summary>
//        /// <returns></returns>
//        public List<PrimaryKeyValue> GetChangedDataList()
//        {
//            this.PostEditor();
//            return changedDatas.Select(item => item.Value).ToList();
//        }

//        public void ClearDataChanged()
//        {
//            changedDatas.Clear();
//        }

//        private void View_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
//        {
//            var meta = GridControlEx.Metadata;
//            if (e.RowHandle <= -1 || meta == null || string.IsNullOrEmpty(meta.PrimaryProperty.Name)) return;
//            string columnName = e.Column.FieldName;
//            string pk = GetRowCellValue(e.RowHandle, meta.PrimaryProperty.Name).ToStringOrEmpty();
//            if (string.IsNullOrEmpty(pk)) return;
//            string columnValue = e.Value.ToStringOrEmpty();
//            AddDataChanged(new PrimaryKeyValue(pk, columnName, columnValue));
//            OnModifyData(EventArgs.Empty);
//        }


//        #endregion

//        private void InitPlugin()
//        {
//            //new GridSettingPlugin().OnInit(this);

//            //var plugins = PluginManage.GetPlugins<IGridControlPluginx>();
//            //if (plugins.Length == 0) return;
//            //foreach (var item in plugins)
//            //{
//            //    try
//            //    {
//            //        item.OnInit(this);
//            //    }
//            //    catch (Exception e)
//            //    {
//            //        DebugHelper.Debug("加载插件" + XCI.Helper.AssemblyHelper.GetTypeFullName(item.GetType())
//            //            + "时发生异常:" + e.Message);
//            //    }
//            //}
//        }

//        private void InitializePopupMenu()
//        {
//            if (this.GridControl == null || this.GridControl.MenuManager == null || !optionsCustom.AllowShowPopupMenu)
//            {
//                return;
//            }
//            foreach (BarItem item in PopupMenuControl.Manager.Items)
//            {
//                if (!(item is BarButtonItem)) continue;
//                PopupMenuControl.ItemLinks.Add(item);
//            }
//        }

//        /// <summary>
//        /// 自定义绘制表头
//        /// </summary>
//        public void DrawColumnHeader(ColumnHeaderCustomDrawEventArgs e, bool isDrawHorzLine, bool isDrawVertLine, bool isDrawText)
//        {
//            if (e.Column == null) { return; }
//            GridViewEx view = this;
//            var appearance = view.Appearance.HeaderPanel;
//            var rect = e.Info.CaptionRect;
//            e.Cache.FillRectangle(appearance.BackColor, e.Bounds);
//            if (isDrawText)
//            {
//                e.Appearance.DrawString(e.Cache, e.Info.Caption, rect, appearance.Font, appearance.ForeColor, appearance.GetStringFormat());
//            }
//            if (isDrawHorzLine)
//            {
//                var first = new Point(e.Bounds.X, e.Bounds.Y + rect.Height + 2);
//                e.Cache.DrawLine(new Pen(appearance.BorderColor, 1), first, new Point(first.X + view.GridControl.Width, first.Y));
//            }
//            if (e.Column.VisibleIndex != 0)
//            {
//                if (isDrawVertLine)
//                {
//                    var offset = 5;
//                    var shuOffset = 3;
//                    if (view.GridControl.DataSource != null && ((System.Collections.IList)view.GridControl.DataSource).Count > 0)
//                    {
//                        shuOffset = 8;
//                    }
//                    //绘制竖线
//                    var first = new Point(rect.X - offset, rect.Y - offset);
//                    e.Cache.DrawLine(new Pen(appearance.BorderColor, 1), first, new Point(first.X, first.Y + rect.Height + shuOffset));
//                }
//            }
//            e.Handled = true;
//        }

//        /// <summary>
//        /// 获取表格二进制配置
//        /// </summary>
//        public string GetSetting()
//        {
//            //this.ApplyFindFilter(null);
//            var ms = new MemoryStream();
//            SaveLayoutToStream(ms, OptionsLayoutBase.FullLayout);
//            ms.Seek(0, System.IO.SeekOrigin.Begin);
//            return Encoding.UTF8.GetString(ms.ToArray());
//        }

//        /// <summary>
//        /// 应用表格二进制配置
//        /// </summary>
//        public void SetSetting(string setting)
//        {
//            if (string.IsNullOrEmpty(setting)) return;
//            var data = Encoding.UTF8.GetBytes(setting);
//            MemoryStream ms = IOHelper.ToMemoryStream(data);
//            if (ms == null) return;
//            RestoreLayoutFromStream(ms, OptionsLayoutBase.FullLayout);
//            ms.Seek(0, System.IO.SeekOrigin.Begin);
//            this.IsLoadedSetting = true;
//        }

//        /// <summary>
//        /// 双击表格行
//        /// </summary>
//        public void DblClickMethod(EventArgs e, Action editAction)
//        {
//            var ev = e as DXMouseEventArgs;
//            if (ev != null)
//            {
//                GridHitInfo info = CalcHitInfo(ev.Location);
//                if (ev.Clicks == 2 && ev.Button == MouseButtons.Right)
//                {
//                    return;
//                }
//                if (ev.Clicks == 2 &&
//                    (info.HitTest == GridHitTest.ColumnEdge
//                     || info.HitTest == GridHitTest.EmptyRow
//                     || info.HitTest == GridHitTest.Column
//                     || info.HitTest == GridHitTest.ColumnButton))
//                {
//                    return;
//                }


//            }
//            if (editAction != null && FocusedRowHandle > -1)
//            {
//                editAction();
//            }
//        }

//        /// <summary>
//        /// 获取勾选的主键数组
//        /// </summary>
//        public string[] GetSelectedIds()
//        {
//            int[] selecteds = GetSelectedRows();
//            int selectedCount = selecteds.Length;
//            if (selectedCount == 0)
//            {
//                return new string[] { };
//            }
//            string[] ids = new string[selectedCount];
//            for (int i = 0; i < selectedCount; i++)
//            {
//                ids[i] = GetRecordId(selecteds[i]);
//            }
//            return ids;
//        }

//        /// <summary>
//        /// 获取勾选的主键字符串,用逗号分开
//        /// </summary>
//        public string GetSelectedIdString()
//        {
//            int[] selecteds = GetSelectedRows();
//            int selectedCount = selecteds.Length;
//            if (selectedCount == 0)
//            {
//                return string.Empty;
//            }
//            StringBuilder sb = new StringBuilder();
//            for (int i = 0; i < selectedCount; i++)
//            {
//                var id = GetRecordId(selecteds[i]);
//                sb.Append(id);
//                if (i != selectedCount - 1)
//                {
//                    sb.Append(",");
//                }
//            }
//            return sb.ToString();
//        }

//        /// <summary>
//        /// 获取选中的主键
//        /// </summary>
//        public string GetSelectedId()
//        {
//            if (SelectedRowsCount > 0)
//            {
//                return GetRecordId(GetSelectedRows()[0]);
//            }
//            return string.Empty;
//        }

//        /// <summary>
//        /// 获取指定行的实体对象
//        /// </summary>
//        /// <param name="rowIndex">行索引号</param>
//        public T Get<T>(int rowIndex) where T : class, new()
//        {
//            var rowObject = this.GetRow(rowIndex);
//            if (rowObject == null) return null;
//            var view = rowObject as DataRowView;
//            if (view == null) return rowObject as T;
//            var instance = new T();
//            DataTableHelper.ConvertToObject(view.Row, () => instance);
//            return instance;
//        }

//        /// <summary>
//        /// 获取选中的实体列表
//        /// </summary>
//        public T GetSelected<T>() where T : class, new()
//        {
//            return Get<T>(FocusedRowHandle);
//        }

//        /// <summary>
//        /// 获取选中的实体列表
//        /// </summary>
//        public List<T> GetSelecteds<T>() where T : class, new()
//        {
//            var entityList = new List<T>();
//            int[] selecteds = GetSelectedRows();
//            int selectedCount = selecteds.Length;
//            if (selectedCount == 0)
//            {
//                return null;
//            }
//            for (int i = 0; i < selectedCount; i++)
//            {
//                entityList.Add(Get<T>(selecteds[i]));
//            }
//            return entityList;
//        }

//        public void SelectEditRow(long id)
//        {
//            ClearSelection();
//            if (id > 0)
//            {
//                SelectRowById(id);
//            }
//        }

//        /// <summary>
//        /// 获取主键
//        /// </summary>
//        /// <param name="selectedIndex">选中行索引</param>
//        public string GetRecordId(int selectedIndex)
//        {
//            string keyName = GridControlEx.Metadata.PrimaryProperty.Name;
//            if (string.IsNullOrEmpty(keyName))
//            {
//                throw new ArgumentException("请指定KeyFieldName属性,主键名不能为空");
//            }
//            return GetRowCellValue(selectedIndex, keyName).ToStringOrEmpty();
//        }

//        /// <summary>
//        /// 选中行使用主键
//        /// </summary>
//        /// <param name="id">主键</param>
//        public void SelectRowById(object id)
//        {
//            if (id.IsEmpty()) return;
//            var rowIndex = GetRowIndexByDataId(id);
//            SelectRowByIndex(rowIndex);
//        }

//        /// <summary>
//        /// 选中行使用主键
//        /// </summary>
//        /// <param name="rowIndex">序号</param>
//        public void SelectRowByIndex(int rowIndex)
//        {
//            if (rowIndex > -1)
//            {
//                SelectRow(rowIndex);
//                FocusedRowHandle = rowIndex;
//            }
//        }

//        /// <summary>
//        /// 获取行索引根据主键
//        /// </summary>
//        /// <param name="id">主键</param>
//        public int GetRowIndexByDataId(object id)
//        {
//            if (id == null) return -1;
//            for (int i = 0; i < this.DataRowCount; i++)
//            {
//                var pkValue = this.GetRowCellValue(i, GridControlEx.Metadata.PrimaryProperty.Name);
//                if (pkValue.ToString().Equals(id.ToString()))
//                {
//                    return i;
//                }
//            }
//            return -1;
//        }

//        /// <summary>
//        /// 获取行索引根据主键
//        /// </summary>
//        /// <param name="columnName">列名</param>
//        /// <param name="columnValue">列值</param>
//        public int GetRowIndexByColumn(string columnName, string columnValue)
//        {
//            for (int i = 0; i < this.DataRowCount; i++)
//            {
//                var value = this.GetRowCellValue(i, columnName);
//                if (value.ToStringOrEmpty().Equals(columnValue.ToStringOrEmpty()))
//                {
//                    return i;
//                }
//            }
//            return -1;
//        }


//        /// <summary>
//        /// 获取选择行的最后一行索引
//        /// </summary>
//        /// <returns></returns>
//        private int LastSelectedRowIndex()
//        {
//            int selectedCount = SelectedRowsCount;
//            if (selectedCount > 0)
//            {
//                return GetSelectedRows()[selectedCount - 1];
//            }
//            return -1;
//        }

//        public void SelectRowByDeleteAfter(Action action)
//        {
//            var lastSelectedIndex = LastSelectedRowIndex();
//            var selectedCount = SelectedRowsCount;
//            var isLast = lastSelectedIndex == RowCount - 1;
//            if (action != null) action();
//            ClearSelection();
//            if (lastSelectedIndex > -1)
//            {
//                var selectedIndex = lastSelectedIndex + 1 - selectedCount;
//                if (isLast)
//                {
//                    selectedIndex--;
//                }
//                if (selectedIndex > -1 && selectedIndex < RowCount)
//                {
//                    SelectRowByIndex(selectedIndex);
//                }
//            }
//        }

//        /// <summary>
//        /// 获取可见数据
//        /// </summary>
//        public object GetVisableData()
//        {
//            var listSource = this.DataSource as IList;
//            if (listSource != null)
//            {
//                return listSource;
//            }

//            var tableSource = this.DataSource as DataTable;
//            if (tableSource != null)
//            {
//                var table = tableSource.Clone();
//                for (int i = 0; i < DataRowCount; i++)
//                {
//                    var row = table.NewRow();
//                    var sourceRow = ((DataRowView)GetRow(i)).Row;
//                    foreach (DataColumn column in table.Columns)
//                    {
//                        var colName = column.ColumnName;
//                        row[colName] = sourceRow[colName];
//                    }
//                    table.Rows.Add(row);
//                }
//                return table;
//            }
//            return null;
//        }

//        /// <summary>
//        /// 自动生成列
//        /// </summary>
//        public void AutoGeneratedColumn()
//        {
//            var meta = GridControlEx.Metadata;
//            //if (meta == null)
//            //{
//            //    var ds = GridControlEx.DataSource;
//            //    if (ds is IList list && list.Count > 0)
//            //    {
//            //        var type = list[0]?.GetType();
//            //        if (type != null)
//            //        {
//            //            meta = EntityHelper.Get(type);
//            //        }
//            //    }
//            //}
//            if (meta == null) return;

//            this.OptionsBehavior.Editable = true;
//            this.OptionsView.ColumnAutoWidth = false;
//            this.IndicatorWidth = 35;
//            this.RowHeight = 30;
//            this.OptionsBehavior.AutoPopulateColumns = false;
//            this.FocusRectStyle = DrawFocusRectStyle.None;
//            this.OptionsCustomization.AllowFilter = false;
//            this.OptionsSelection.CheckBoxSelectorColumnWidth = 30;
//            this.OptionsSelection.EnableAppearanceHideSelection = false;
//            this.OptionsSelection.EnableAppearanceFocusedCell = false;
//            this.OptionsSelection.EnableAppearanceFocusedRow = true;
//            this.OptionsSelection.MultiSelect = true;
//            this.OptionsSelection.MultiSelectMode = GridMultiSelectMode.CheckBoxRowSelect;
//            this.OptionsSelection.ResetSelectionClickOutsideCheckboxSelector = true;
//            this.Columns.Clear();

//            int index = 0;
//            foreach (var item in meta.AllColumns)
//            {
//                var col = item.Value;
//                GridColumn column = new GridColumn();
//                column.VisibleIndex = index + 1;
//                column.Name = string.Format("col_{0}", StringHelper.Guid());
//                column.FieldName = col.Name;
//                column.Caption = col.Caption ?? col.Name;
//                column.OptionsColumn.AllowEdit = false;

//                var dataType = col.Property.Property.PropertyType;
//                if (dataType == typeof(DateTime) || dataType == typeof(DateTime?))
//                {
//                    column.DisplayFormat.FormatType = DevExpress.Utils.FormatType.DateTime;
//                    column.DisplayFormat.FormatString = "yyyy-MM-dd HH:mm:ss";
//                }
//                else if (dataType == typeof(decimal) || dataType == typeof(decimal?))
//                {
//                    column.DisplayFormat.FormatType = DevExpress.Utils.FormatType.Numeric;
//                    column.DisplayFormat.FormatString = "#.##";
//                }

//                if (col.Name.Equals(meta.PrimaryProperty.Name))
//                {
//                    column.Visible = false;
//                }
//                else
//                {
//                    column.Visible = col.Visable;
//                }

//                this.Columns.Add(column);
//                index++;
//            }
//            this.BestFitColumns();
//            this.IsAutoGeneratedColumn = true;
//        }
//    }
//}